package com.gdust.hzx.product.service.impl;

import com.alibaba.fastjson.JSON;
import com.gdust.hzx.model.dto.h5.ProductSkuDto;
import com.gdust.hzx.model.dto.product.SkuSaleDto;
import com.gdust.hzx.model.entity.product.Product;
import com.gdust.hzx.model.entity.product.ProductDetails;
import com.gdust.hzx.model.entity.product.ProductSku;
import com.gdust.hzx.model.vo.h5.ProductItemVo;
import com.gdust.hzx.product.mapper.ProductDetailsMapper;
import com.gdust.hzx.product.mapper.ProductMapper;
import com.gdust.hzx.product.mapper.ProductSkuMapper;
import com.gdust.hzx.product.service.ProductService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * ClassName: ProductServiceImpl
 * Package: com.gdust.hzx.product.service.impl
 * Description:
 * spu: 商品名称或通用属性（如品牌、型号等）
 * sku: 商品的具体参数（如颜色、规格等）
 *
 * @Author syun
 * @Create 2024/12/25 21:11
 * @Version 1.0
 */
@Service
public class ProductServiceImpl implements ProductService {
    /**
     * 注入商品sku表的mapper
     */
    @Autowired
    private ProductSkuMapper productSkuMapper;

    /**
     *  注入产品表的mapper
     */
    @Autowired
    private ProductMapper productMapper;

    /**
     * 注入商品sku属性表的mapper
     */
    @Autowired
    private ProductDetailsMapper productDetailsMapper;

    /**
     * 根据销量排序，获取前10条记录
     * @return
     */
    @Override
    public List<ProductSku> selectProductSkuBySale() {
        return productSkuMapper.selectProductSkuBySale();
    }

    /**
     * 分页查询产品列表
     * @param page 当前页
     * @param limit 每页记录数
     * @param productSkuDto 商品列表搜索条件
     * @return
     */
    @Override
    public PageInfo<ProductSku> findByPage(Integer page, Integer limit, ProductSkuDto productSkuDto) {
        //使用PageHelper分页插件实行分页
        PageHelper.startPage(page,limit);

        // 根据搜索条件查询符合条件的商品列表
        List<ProductSku> list = productSkuMapper.findByPage(productSkuDto);

        // 将查询结果封装到 PageInfo,用于分页展示
        PageInfo<ProductSku> pageInfo = new PageInfo<>(list);

        // 返回封装的分页信息
        return pageInfo;
    }

    /**
     * 查询商品详情
     * 需求说明：当点击某一个商品的时候，此时就需要在商品详情页面展示出商品的详情数据
     * sku: 商品的具体参数（如颜色、规格等）
     * @param skuId 商品skuId
     * @return
     */
    @Override
    public ProductItemVo item(Long skuId) {
        //1.创建商品详情vo对象，用于封装最终数据
        //商品详情对象包含：商品sku信息、商品信息、商品轮播图列表、商品详情图片列表、商品规格信息、商品规格对应商品skuId信息
        ProductItemVo productItemVo = new ProductItemVo();

        //2.根据skuId获取sku信息(2.当前商品sku的基本信息)
        ProductSku productSku = productSkuMapper.getById(skuId);

        //3.根据第二步获取sku，从sku获取productId,获取商品信息(1.商品的基本信息)
        Long productId = productSku.getProductId();
        Product product = productMapper.getById(productId);

        //4.通过productId,获取商品详细信息
        ProductDetails productDetails = productDetailsMapper.getByProductId(productId);

        //5.封装map集合 == 商品规格对应商品skuId信息(6.当前商品sku的规格属性)
        Map<String,Object> skuSpecValueMap = new HashMap<>();
        //5.1根据商品id获取商品所有sku列表
        List<ProductSku> productSkuList = productSkuMapper.findByProductId(productId);
        // 遍历 productSkuList 列表，将每个商品 SKU 的规格 (skuSpec) 和对应的 SKU ID 存入 skuSpecValueMap
        productSkuList.forEach(item -> {
            // 将当前商品 SKU 的规格 (skuSpec) 作为键，SKU 的 ID (item.getId()) 作为值，存入 Map
            skuSpecValueMap.put(item.getSkuSpec(), item.getId());
        });


        //6.把需要的数据封装到productItemVo里面
        //6.1 设置商品信息
        productItemVo.setProduct(product);
        //6.2 设置商品sku信息
        productItemVo.setProductSku(productSku);
        //6.3 设置商品规格对应商品skuId信息
        productItemVo.setSkuSpecValueMap(skuSpecValueMap);
        //6.4 设置商品详情图片列表 list集合
        productItemVo.setDetailsImageUrlList(Arrays.asList(productDetails.getImageUrls().split(",")));
        //6.5 设置商品轮播图列表 list集合
        productItemVo.setSliderUrlList(Arrays.asList(product.getSliderUrls().split(",")));
        //6.6 设置商品规格信息 list集合
        productItemVo.setSpecValueList(JSON.parseArray(product.getSpecValue()));

        // 返回封装的商品详情对象
        return productItemVo;
    }

    /**
     * 远程调用：根据skuId返回sku信息
     * @param skuId
     * @return
     */
    @Override
    public ProductSku getBySkuId(Long skuId) {
        //自定义查询：根据skuId获取sku信息
        return productSkuMapper.getById(skuId);
    }

//    @Transactional
//    @Override
//    public Boolean updateSkuSaleNum(List<SkuSaleDto> skuSaleDtoList) {
//        if(!CollectionUtils.isEmpty(skuSaleDtoList)) {
//            for(SkuSaleDto skuSaleDto : skuSaleDtoList) {
//                productSkuMapper.updateSale(skuSaleDto.getSkuId(), skuSaleDto.getNum());
//            }
//        }
//        return true;
//    }
}
